package com.cskaoyan.market.shiro;

import org.apache.shiro.web.session.mgt.DefaultWebSessionManager;
import org.apache.shiro.web.util.WebUtils;
import org.springframework.stereotype.Component;

import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.Serializable;

/**
 * @ClassName MarketSessionManager
 * @Description: TODO
 * @Author 远志 zhangsong@cskaoyan.onaliyun.com
 * @Date 2023/5/19 14:27
 * @Version V1.0
 **/
@Component
public class MarketSessionManager extends DefaultWebSessionManager {

    private static final String WX_TOKEN = "X-CskaoyanMarket-Token";

    private static final String ADMIN_TOKEN = "X-Cskaoyanmarket-Admin-Token";

    @Override
    protected Serializable getSessionId(ServletRequest request, ServletResponse response) {
        //shiro里面的session获取凭证，和httpSession的原理是一致的
        //只不过针对httpSession做了进一步的扩展，不仅仅可以获取Cookie:JSESSIONID=xxx请求头，而且还支持自定义获取特定的请求头
        String token = WebUtils.toHttp(request).getHeader(WX_TOKEN);
        if(token == null){
            //尝试去获取后台token
            token = WebUtils.toHttp(request).getHeader(ADMIN_TOKEN);
            if(token == null){
                //没有凭证  直接抛异常，advicer去捕获异常，返回自定义结果
                //大家在做项目开发的时候，可以直接写下面的抛出异常，但是我们这里演示的时候，因为没有携带token，所以会话失败，重写了 该方法，让其可以基于Cookie实现会话技术
                return super.getSessionId(request, response);
                //throw new AuthenticationException("当前接口未登录禁止使用");
            }
        }
        return token;
    }
}
